home *** CD-ROM | disk | FTP | other *** search
/ Ham Radio 2000 #1 / Ham Radio 2000.iso / ham2000 / packet / p_aa4re / bb212src / bboprm2.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1992-02-16  |  4.4 KB  |  128 lines

  1. (*===========================================================================*)
  2. (* Subroutine to swap message blocks                                         *)
  3. (*                                                                           *)
  4. (*   Copyright 1989, 1991 by H. Roy Engehausen.  All rights reserved.        *)
  5. (*                                                                           *)
  6. (*===========================================================================*)
  7.  
  8. PROCEDURE msg_resize(VAR msg_ptr : msg_index_ptr; new_subject_size : BYTE);
  9.   VAR
  10.  
  11.     i              : BYTE;
  12.     m_overhead     : WORD;
  13.     msg_route_look : msg_r_ptr;
  14.     n_msg_ptr      : msg_index_ptr;
  15.     w_msg_ptr      : msg_index_ptr;
  16.  
  17.   BEGIN;
  18.  
  19.     {$IFDEF POINT_CHK}
  20.       test_pointer(msg_ptr);
  21.     {$ENDIF}
  22.  
  23.     (*-----------------------------------------------------------------------*)
  24.     (* Calculate overhead!                                                   *)
  25.     (*-----------------------------------------------------------------------*)
  26.  
  27.     w_msg_ptr  := msg_ptr;
  28.     m_overhead := OFS(w_msg_ptr^.msg_i_mb.msg_subj[1]) - OFS(w_msg_ptr^);
  29.  
  30.     (*-----------------------------------------------------------------------*)
  31.     (* Get spot for new message and move things in                           *)
  32.     (*-----------------------------------------------------------------------*)
  33.  
  34.     GETMEM(n_msg_ptr, m_overhead + new_subject_size);
  35.  
  36.     MOVE(msg_ptr^, n_msg_ptr^, m_overhead);
  37.  
  38.     (*-----------------------------------------------------------------------*)
  39.     (* Fixup forward and backward pointers                                   *)
  40.     (*-----------------------------------------------------------------------*)
  41.  
  42.     w_msg_ptr             := n_msg_ptr^.msg_i_next;
  43.     w_msg_ptr^.msg_i_last := n_msg_ptr;
  44.  
  45.     w_msg_ptr             := n_msg_ptr^.msg_i_last;
  46.     w_msg_ptr^.msg_i_next := n_msg_ptr;
  47.  
  48.     (*-----------------------------------------------------------------------*)
  49.     (* Fixup start/end pointers                                              *)
  50.     (*-----------------------------------------------------------------------*)
  51.  
  52.     IF msg_index_start = msg_ptr THEN
  53.       msg_index_start := n_msg_ptr;
  54.  
  55.     IF msg_index_end = msg_ptr THEN
  56.       msg_index_end := n_msg_ptr;
  57.  
  58.     (*-----------------------------------------------------------------------*)
  59.     (* Find and fixup forward list chain                                     *)
  60.     (*-----------------------------------------------------------------------*)
  61.  
  62.     w_msg_ptr := msg_index_start;
  63.  
  64.     WHILE (w_msg_ptr <> msg_ptr) AND (w_msg_ptr <> NIL) DO
  65.       BEGIN;
  66.  
  67.         {$IFDEF POINT_CHK}
  68.           test_pointer(w_msg_ptr);
  69.         {$ENDIF}
  70.  
  71.         IF w_msg_ptr^.msg_i_fwd_l = msg_ptr THEN
  72.           BEGIN;
  73.             w_msg_ptr^.msg_i_fwd_l := n_msg_ptr;
  74.             w_msg_ptr := NIL;
  75.           END
  76.         ELSE
  77.           w_msg_ptr := w_msg_ptr^.msg_i_next;
  78.  
  79.       END;
  80.  
  81.     (*-----------------------------------------------------------------------*)
  82.     (* Find and fixup fnr list                                               *)
  83.     (*-----------------------------------------------------------------------*)
  84.  
  85.     w_msg_ptr := msg_index_start;
  86.  
  87.     WHILE (w_msg_ptr <> msg_ptr) AND (w_msg_ptr <> NIL) DO
  88.       BEGIN;
  89.  
  90.         {$IFDEF POINT_CHK}
  91.           test_pointer(w_msg_ptr);
  92.         {$ENDIF}
  93.  
  94.         IF w_msg_ptr^.msg_i_fnm_l = msg_ptr THEN
  95.           BEGIN;
  96.             w_msg_ptr^.msg_i_fnm_l := n_msg_ptr;
  97.             w_msg_ptr := NIL;
  98.           END
  99.         ELSE
  100.           w_msg_ptr := w_msg_ptr^.msg_i_next;
  101.  
  102.       END;
  103.  
  104.     (*-----------------------------------------------------------------------*)
  105.     (* Sleep a while.  Allows other pointers to clear                        *)
  106.     (*-----------------------------------------------------------------------*)
  107.  
  108.     FOR i := 1 TO 20 DO
  109.       task_switch;
  110.  
  111.     (*-----------------------------------------------------------------------*)
  112.     (* Throw away old message                                                *)
  113.     (*-----------------------------------------------------------------------*)
  114.  
  115.     FREEMEM(msg_ptr, m_overhead + LENGTH(msg_ptr^.msg_i_mb.msg_subj));
  116.  
  117.     msg_ptr := n_msg_ptr;
  118.  
  119.     {$IFDEF POINT_CHK}
  120.       test_pointer(msg_ptr);
  121.     {$ENDIF}
  122.  
  123.     {$IFDEF FREE_CHK}
  124.       test_free_list;
  125.     {$ENDIF}
  126.  
  127.   END;
  128.